package 多线程4;
//工厂模式 也是一种设计模式和单例模式是并列的关系
//工厂模式存在的意义,就是在给构造方法填坑

/**
 * 工厂模式主要是为了创建实例
 * 正经八本的创建实例是通过构造方法.
 * 构造方法的限制比较多:
 * 1.构造方法的名字,必须是固定的(类名)
 * 2.如果需要多个版本的构造方式,就只能依赖构造方法的重载(重载又要求方法参数的个数和类型不一致)
 *
 * 假设我们有个类Point,表示平面上第一个点
 * 我们希望通过笛卡尔坐标和极坐标,两种方式来构造这个点
 * class Point{
 *     public Point(double x,double y){...};通过笛卡尔坐标构造
 *     public Point(double r,double a){...};通过极坐标构造
 *      但是这两方法的参数个数和类型都一样
 *      这个时候编译不了...
 *      而且构造方法的方法名都是固定的.
 *      光看方法名,并不知道咱们想使用哪种方式构造.
 *
 *      解决这个问题:
 *      不使用构造方法来构造实例了..
 *      而是使用其他的方法进行构造实例.这样的用来构造实例的方法,就称为"工厂方法"
 *
 *      工厂方法其实就是普通的方法.这个工厂方法里面会调用对应的构造方法
 *      并进行一些初始化操作,并返回这个对象的实例
 *
 *      /**
 *  *  标准库中提供了一个Executors这个类.
 *  *  这个类相当于一个"工厂类"
 *  *  通过这个类提供的一组工厂方法,就可以创建出不同风格的线程池实例了.
 *  *  1.newFixedThreadPool:创建出一个固定线程数量的线程池.(完全没有临时工的版本)
 *  *  2.newCachedThreadPool:创建出一个数量可变的线程池.(完全没有正式员工,全是临时工)
 *  *  3.newSingleThreadPool:创建出一个数量可变的线程池.(只是特定场景下使用)
 *  *  4.newScheduleThreadPool:能够设定延时时间的线程池.(插入的任务能够过一会再执行),相当于进阶版的定时器
 *  *
 *
 *  在这几个工厂方法里面,调用了ThreadPoolExecutor的构造方法,
 *  同时把对应的参数进行了传递
 *  并返回这样的ThreadPoolExecutor实例
 */
//对于设计模式
/**
 * 构造方法,是Java语言本身的规则~所以才需要工厂模式.
 * C++里面的情况也差不多.因此也是需要工厂模式的.
 * Python的情况就差别很大了._init_,Python里面对于参数的支持更加灵活.尤其是支持"关键字参数"+
 * "默认参数"这样的语法.这就导致在Python中如果想有多种不同的方式来构造实例,都可以用一个_init_来搞定,
 * 只要传递不同的关键字参数即可...
 * 因此像这样的语言就不太需要"工厂模式"
 *
 *  设计模式,其实是和语言相关的.
 *      有的语言自身设计的比较优秀,其实就不要依赖设计模式.(语法自身已经做出了规范)
 *      有的语言自身设计的没那么优秀,语法上存在一些坑,就更依赖设计模式进行约束...
 */
public class TestDemo4 {
}
